package com.icode.lock8;

import java.util.concurrent.TimeUnit;

/**
 * @Author: my_code
 * @Email: my_code@foxmail.com
 * @Create: 2020-12-10 18:54
 *
 * Q:7
 *  一个同步方法一个静态同步方法，两个线程操作同一个的对象，先打印“B”
 *      A线程执行methodA()时先拿到phone5.class的锁并执行方法体
 *      B线程执行methodB()时先拿到phone1的对象锁并执行方法体，AB线程互不影响，
 *      由于A方法中睡眠了4秒，所以B线程先打印
 *  一个同步方法一个静态同步方法，两个线程操作两个的对象，先打印“B”
 *      A线程执行methodA()时先拿到phone5.class的锁并执行方法体
 *      B线程执行methodB()时先拿到phone2的对象锁并执行方法体，AB线程互不影响，
 *      由于A方法中睡眠了4秒，所以B线程先打印
 */
public class Test5 {
    public static void main(String[] args) {
        Phone5 phone1 = new Phone5();

        new Thread(()->{phone1.methodA();}).start();

        //延时2秒 让线程先拿到锁
        try {
            TimeUnit.SECONDS.sleep(2);} catch (InterruptedException e) {e.printStackTrace();}

        new Thread(()->{phone1.methodB();}).start();
    }
}

class Phone5{

    //synchronized 锁的是对象方法的调用者
    //static 静态方法
    //类一加载就有了！锁的是 Class 模板
    public static synchronized void methodA(){
        try {TimeUnit.SECONDS.sleep(4);} catch (InterruptedException e) {e.printStackTrace();}
        System.out.println("方法A");
    }
    public synchronized void methodB(){
        System.out.println("方法B");
    }
}